﻿using SDE_FIC.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Data;
using MySql.Data.MySqlClient;
using SDE_FIC.Util;

namespace SDE_FIC.DAO
{
    public class AlunoDAO
    {
        private DBConnect _db;

        public AlunoDAO(ref DBConnect db)
        {
            this._db = db;

        }

        private StringBuilder GetPrefix()
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("SELECT ");
            sb.AppendLine("  `idaluno`,");
            sb.AppendLine("  `nome`,");
            sb.AppendLine("  `telefone`,");
            sb.AppendLine("  `rg`,");
            sb.AppendLine("  `cpf`,");
            sb.AppendLine("  `datanasc`,");
            sb.AppendLine("  `logradouro`,");
            sb.AppendLine("  `numero`,");
            sb.AppendLine("  `bairro`,");
            sb.AppendLine("  `cidade`,");
            sb.AppendLine("  `estado`,");
            sb.AppendLine("  `cep`,");
            sb.AppendLine("  `responsavel`,");
            sb.AppendLine("  `foneresponsavel`,");
            sb.AppendLine("  `observacao`");
            sb.AppendLine("FROM ");
            sb.AppendLine("  `aluno`");

            return sb;
        }

        private Aluno loadObject(ref DataRow row)
        {
            Aluno _aluno = new SDE_FIC.Models.Aluno();

            _aluno.IdAluno = Convert.ToInt16(row["idaluno"]);
            _aluno.Nome = Convert.ToString(ValueUtil.DBNullToString(row["nome"]));
            _aluno.Telefone = Convert.ToString(ValueUtil.DBNullToString(row["telefone"]));
            _aluno.RG = Convert.ToString(ValueUtil.DBNullToString(row["rg"]));
            _aluno.CPF = Convert.ToString(ValueUtil.DBNullToString(row["cpf"]));
            //_aluno.DataNascimento = (DateTime)row["datanasc"];
            _aluno.DataNascimento = Convert.ToDateTime(row["datanasc"].ToString());
            _aluno.Logradouro = Convert.ToString(ValueUtil.DBNullToString(row["logradouro"]));
            _aluno.Numero = Convert.ToString(ValueUtil.DBNullToString(row["numero"]));
            _aluno.Bairro = Convert.ToString(ValueUtil.DBNullToString(row["bairro"]));
            _aluno.Cidade = Convert.ToString(ValueUtil.DBNullToString(row["cidade"]));
            _aluno.Estado = Convert.ToString(ValueUtil.DBNullToString(row["estado"]));
            _aluno.CEP = Convert.ToString(ValueUtil.DBNullToString(row["cep"]));
            _aluno.Responsavel = Convert.ToString(ValueUtil.DBNullToString(row["responsavel"]));
            _aluno.TelefoneResponsavel = Convert.ToString(ValueUtil.DBNullToString(row["foneresponsavel"]));
            _aluno.Observacao = Convert.ToString(ValueUtil.DBNullToString(row["observacao"]));

            return _aluno;
        }

        /// <summary>
        /// Consulta aluno por ID
        /// </summary>
        /// <param name="IdAluno">Código do Aluno</param>
        /// <returns></returns>
        public Aluno LoadById(int IdAluno)
        {
            Aluno _aluno = null;

            StringBuilder sbSQL = GetPrefix();
            sbSQL.AppendLine("WHERE idaluno = @idaluno ");

            MySqlCommand myCMD = new MySqlCommand();
            myCMD.CommandText = sbSQL.ToString();
            myCMD.Connection = _db.Connection;
            myCMD.Parameters.Add("@idaluno", MySqlDbType.Int16, 0).Value = IdAluno;

            DataTable dt = _db.ExecuteQuery(ref myCMD);

            if (dt.Rows.Count == 1)
            {
                DataRow dr = dt.Rows[0];
                _aluno = loadObject(ref dr);

            }

            return _aluno;

        }

        public List<Aluno> All()
        {
            List<Aluno> lAluno = new List<Aluno>();

            StringBuilder sb = GetPrefix();

            MySqlCommand myCMD = new MySqlCommand();
            myCMD.Connection = _db.Connection;
            myCMD.CommandText = sb.ToString();


            DataTable dt = _db.ExecuteQuery(ref myCMD);

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                DataRow dr = dt.Rows[i];
                lAluno.Add(loadObject(ref dr));
            }

            return lAluno;

        }
        
        /// <summary>
        /// Inserir Novo Registro
        /// </summary>
        /// <param name="_obj"></param>
        public void Insert(Aluno _obj)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("INSERT INTO ");
            sb.AppendLine("  `aluno`");
            sb.AppendLine("(");
            sb.AppendLine("  `nome`,");
            sb.AppendLine("  `telefone`,");
            sb.AppendLine("  `rg`, ");
            sb.AppendLine("  `cpf`, ");
            sb.AppendLine("  `datanasc`, ");
            sb.AppendLine("  `logradouro`, ");
            sb.AppendLine("  `numero`, ");
            sb.AppendLine("  `bairro`, ");
            sb.AppendLine("  `cidade`, ");
            sb.AppendLine("  `estado`, ");
            sb.AppendLine("  `cep`, ");
            sb.AppendLine("  `responsavel`, ");
            sb.AppendLine("  `foneresponsavel`, ");
            sb.AppendLine("  `observacao`");
            sb.AppendLine(")");
            sb.AppendLine("VALUE (");
            sb.AppendLine("  @nome,");
            sb.AppendLine("  @telefone,");
            sb.AppendLine("  @rg, ");
            sb.AppendLine("  @cpf, ");
            sb.AppendLine("  @datanasc, ");
            sb.AppendLine("  @logradouro, ");
            sb.AppendLine("  @numero, ");
            sb.AppendLine("  @bairro, ");
            sb.AppendLine("  @cidade, ");
            sb.AppendLine("  @estado, ");
            sb.AppendLine("  @cep, ");
            sb.AppendLine("  @responsavel, ");
            sb.AppendLine("  @foneresponsavel, ");
            sb.AppendLine("  @observacao );");

            try
            {
                MySqlCommand myCMD = new MySqlCommand();
                myCMD.Connection = _db.Connection;
                myCMD.Transaction = _db.Transaction;
                myCMD.CommandText = sb.ToString();
                myCMD.Parameters.Add("@nome", MySqlDbType.VarChar, 100).Value = _obj.Nome;
                myCMD.Parameters.Add("@telefone", MySqlDbType.VarChar, 50).Value = _obj.Telefone;
                myCMD.Parameters.Add("@rg", MySqlDbType.VarChar, 14).Value = _obj.RG;
                myCMD.Parameters.Add("@cpf", MySqlDbType.VarChar, 21).Value = _obj.CPF;
                myCMD.Parameters.Add("@datanasc", MySqlDbType.Date).Value = _obj.DataNascimento;
                myCMD.Parameters.Add("@logradouro", MySqlDbType.VarChar, 80).Value = _obj.Logradouro;
                myCMD.Parameters.Add("@numero", MySqlDbType.VarChar, 10).Value = _obj.Numero;
                myCMD.Parameters.Add("@bairro", MySqlDbType.VarChar, 40).Value = _obj.Bairro;
                myCMD.Parameters.Add("@cidade", MySqlDbType.VarChar, 40).Value = _obj.Cidade;
                myCMD.Parameters.Add("@estado", MySqlDbType.VarChar, 30).Value = _obj.Estado;
                myCMD.Parameters.Add("@cep", MySqlDbType.VarChar, 10).Value = _obj.CEP;
                myCMD.Parameters.Add("@responsavel", MySqlDbType.VarChar, 100).Value = _obj.Responsavel;
                myCMD.Parameters.Add("@foneresponsavel", MySqlDbType.VarChar, 45).Value = _obj.TelefoneResponsavel;
                myCMD.Parameters.Add("@observacao", MySqlDbType.VarChar, 255).Value = _obj.Observacao;

                myCMD.ExecuteNonQuery();

            }
            catch (Exception _ex)
            {
                throw _ex;

            }


        }

        /// <summary>
        /// Atualizar registro
        /// </summary>
        /// <param name="_obj"></param>
        /// <returns></returns>
        public int Update(Aluno _obj)
        {
            int iAffectedRows = 0;

            StringBuilder sb = new StringBuilder();

            sb.AppendLine(" UPDATE ");
            sb.AppendLine("  `aluno` ");
            sb.AppendLine(" SET ");
            sb.AppendLine("  `nome` = @nome,");
            sb.AppendLine("  `telefone` = @telefone,");
            sb.AppendLine("  `rg` = @rg, ");
            sb.AppendLine("  `cpf` = @cpf, ");
            sb.AppendLine("  `datanasc` = @datanasc, ");
            sb.AppendLine("  `logradouro` = @logradouro, ");
            sb.AppendLine("  `numero` = @numero, ");
            sb.AppendLine("  `bairro` = @bairro, ");
            sb.AppendLine("  `cidade` = @cidade, ");
            sb.AppendLine("  `estado`  =@estado, ");
            sb.AppendLine("  `cep` = @cep, ");
            sb.AppendLine("  `responsavel` = @responsavel, ");
            sb.AppendLine("  `foneresponsavel`  =@foneresponsavel, ");
            sb.AppendLine("  `observacao` = @observacao");
            sb.AppendLine(" WHERE ");
            sb.AppendLine("  `idaluno` = @idaluno;");


            try
            {
                MySqlCommand myCMD = new MySqlCommand();
                myCMD.Connection = _db.Connection;
                myCMD.Transaction = _db.Transaction;
                myCMD.CommandText = sb.ToString();
                myCMD.Parameters.Add("@nome", MySqlDbType.VarChar, 100).Value = _obj.Nome;
                myCMD.Parameters.Add("@telefone", MySqlDbType.VarChar, 50).Value = _obj.Telefone;
                myCMD.Parameters.Add("@rg", MySqlDbType.VarChar, 14).Value = _obj.RG;
                myCMD.Parameters.Add("@cpf", MySqlDbType.VarChar, 21).Value = _obj.CPF;
                myCMD.Parameters.Add("@datanasc", MySqlDbType.Date).Value = _obj.DataNascimento;
                myCMD.Parameters.Add("@logradouro", MySqlDbType.VarChar, 80).Value = _obj.Logradouro;
                myCMD.Parameters.Add("@numero", MySqlDbType.VarChar, 10).Value = _obj.Numero;
                myCMD.Parameters.Add("@bairro", MySqlDbType.VarChar, 40).Value = _obj.Bairro;
                myCMD.Parameters.Add("@cidade", MySqlDbType.VarChar, 40).Value = _obj.Cidade;
                myCMD.Parameters.Add("@estado", MySqlDbType.VarChar, 30).Value = _obj.Estado;
                myCMD.Parameters.Add("@cep", MySqlDbType.VarChar, 10).Value = _obj.CEP;
                myCMD.Parameters.Add("@responsavel", MySqlDbType.VarChar, 100).Value = _obj.Responsavel;
                myCMD.Parameters.Add("@foneresponsavel", MySqlDbType.VarChar, 45).Value = _obj.TelefoneResponsavel;
                myCMD.Parameters.Add("@observacao", MySqlDbType.VarChar, 255).Value = _obj.Observacao;
                myCMD.Parameters.Add("@idaluno", MySqlDbType.Int32, 0).Value = _obj.IdAluno;


                iAffectedRows = myCMD.ExecuteNonQuery();

            }
            catch (Exception _ex)
            {
                throw _ex;

            }

            return iAffectedRows;

        }

        /// <summary>
        /// Apagar registro
        /// </summary>
        /// <param name="unidadecurricular"></param>
        public void Delete(Aluno _obj)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("DELETE FROM                                  ");
            sb.AppendLine("  `aluno`                        ");
            sb.AppendLine("WHERE                                        ");
            sb.AppendLine("  idaluno = @idaluno ");

            try
            {
                MySqlCommand myCMD = new MySqlCommand();
                myCMD.Connection = _db.Connection;
                myCMD.Transaction = _db.Transaction;
                myCMD.CommandText = sb.ToString();
                myCMD.Parameters.Add("@idaluno", MySqlDbType.Int16).Value = _obj.IdAluno;

                myCMD.ExecuteNonQuery();

            }
            catch (Exception _ex)
            {
                throw _ex;

            }

        }
    }
}